package com.mm.cloth.utils;

import android.util.Log;

import java.io.IOException;
import java.nio.charset.Charset;

import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okio.Buffer;

/**
 * API调试拦截器
 * 用于打印接口请求和响应的详细信息
 */
public class ApiDebugInterceptor implements Interceptor {
    
    private static final String TAG = "ApiDebug";
    private static final Charset UTF8 = Charset.forName("UTF-8");
    
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        
        // 打印请求信息
        logRequest(request);
        
        // 执行请求
        long startTime = System.currentTimeMillis();
        Response response = chain.proceed(request);
        long endTime = System.currentTimeMillis();

        // 打印响应信息并返回处理后的response
        return logResponse(response, endTime - startTime);
    }
    
    /**
     * 打印请求信息
     */
    private void logRequest(Request request) {
        try {
            Log.d(TAG, "╔══════════════════════════════════════════════════════════════════════════════════════");
            Log.d(TAG, "║ REQUEST");
            Log.d(TAG, "╠══════════════════════════════════════════════════════════════════════════════════════");
            Log.d(TAG, "║ URL: " + request.url());
            Log.d(TAG, "║ Method: " + request.method());
            
            // 打印请求头
            if (request.headers().size() > 0) {
                Log.d(TAG, "║ Headers:");
                for (int i = 0; i < request.headers().size(); i++) {
                    String name = request.headers().name(i);
                    String value = request.headers().value(i);
                    // 隐藏敏感信息
                    if ("Authorization".equalsIgnoreCase(name) && value.length() > 20) {
                        value = value.substring(0, 20) + "...";
                    }
                    Log.d(TAG, "║   " + name + ": " + value);
                }
            }
            
            // 打印请求体
            RequestBody requestBody = request.body();
            if (requestBody != null) {
                Log.d(TAG, "║ Request Body:");
                Log.d(TAG, "║   Content-Type: " + requestBody.contentType());
                Log.d(TAG, "║   Content-Length: " + requestBody.contentLength());
                
                if (isPlaintext(requestBody.contentType())) {
                    Buffer buffer = new Buffer();
                    requestBody.writeTo(buffer);
                    String bodyString = buffer.readString(UTF8);
                    Log.d(TAG, "║   Body: " + bodyString);
                }
            }
            
            Log.d(TAG, "╚══════════════════════════════════════════════════════════════════════════════════════");
            
        } catch (Exception e) {
            Log.e(TAG, "打印请求信息失败: " + e.getMessage());
        }
    }
    
    /**
     * 打印响应信息
     */
    private Response logResponse(Response response, long duration) {
        try {
            Log.d(TAG, "╔══════════════════════════════════════════════════════════════════════════════════════");
            Log.d(TAG, "║ RESPONSE");
            Log.d(TAG, "╠══════════════════════════════════════════════════════════════════════════════════════");
            Log.d(TAG, "║ URL: " + response.request().url());
            Log.d(TAG, "║ Code: " + response.code() + " " + response.message());
            Log.d(TAG, "║ Duration: " + duration + "ms");

            // 打印响应头
            if (response.headers().size() > 0) {
                Log.d(TAG, "║ Headers:");
                for (int i = 0; i < response.headers().size(); i++) {
                    Log.d(TAG, "║   " + response.headers().name(i) + ": " + response.headers().value(i));
                }
            }

            // 打印响应体
            ResponseBody responseBody = response.body();
            if (responseBody != null) {
                Log.d(TAG, "║ Response Body:");
                Log.d(TAG, "║   Content-Type: " + responseBody.contentType());
                Log.d(TAG, "║   Content-Length: " + responseBody.contentLength());

                if (isPlaintext(responseBody.contentType())) {
                    String bodyString = responseBody.string();
                    Log.d(TAG, "║   Body: " + bodyString);

                    // 重新创建ResponseBody，因为string()方法会消耗掉body
                    ResponseBody newResponseBody = ResponseBody.create(responseBody.contentType(), bodyString);
                    response = response.newBuilder().body(newResponseBody).build();
                }
            }

            Log.d(TAG, "╚══════════════════════════════════════════════════════════════════════════════════════");

        } catch (Exception e) {
            Log.e(TAG, "打印响应信息失败: " + e.getMessage());
        }

        return response;
    }
    
    /**
     * 判断是否为纯文本类型
     */
    private boolean isPlaintext(MediaType mediaType) {
        if (mediaType == null) return false;
        
        String type = mediaType.type();
        String subtype = mediaType.subtype();
        
        return "text".equals(type) || 
               "application".equals(type) && ("json".equals(subtype) || 
                                             "xml".equals(subtype) || 
                                             "x-www-form-urlencoded".equals(subtype));
    }
}
